package com.atguigu.srb.core.controller.api;


import com.atguigu.srb.base.response.R;
import com.atguigu.srb.core.pojo.entity.LendReturn;
import com.atguigu.srb.core.service.LendReturnService;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 还款记录表 前端控制器
 * </p>
 *
 * @author Atguigu
 * @since 2023-05-26
 */
@RestController
@RequestMapping("/api/core/lendReturn")
public class ApiLendReturnController {
    @Resource
    LendReturnService lendReturnService;

    /**
     * 借款人提交还款请求：
     *         需要参数：还款计划id、token
     *      1、检查还款计划状态：
     *      2、检查借款人账户余额：
     *      3、构建自动提交的表单
     *              让浏览器访问hfb的还款接口 进行还款
     *      4、保存交易流水日志
     *
     *  回调接口：
     *      1、接收参数：验签
     *      2、校验resultCode
     *      幂等性校验
     *      3、校验还款金额是否正确
     *      4、还款成功：hfb已经将借款人账户中的还款金额扣除转到了投资人们的账户中
     *          4.1 更新借款人账户：扣除还款金额
     *          4.2 更新投资人账户：入账
     *          4.3 更新还款计划的状态
     *          4.4 更新回款计划的状态
     *          4.5 更新交易流水日志状态
     * @param token
     * @return
     */
    @ApiOperation("借款人还款")
    @PostMapping("/auth/commitReturn/{id}")
    public R commitReturn(@PathVariable("id")String id,
                          @RequestHeader("token")String token){
        String form = lendReturnService.commitReturn(id,token);
        return R.ok().data("form",form);
    }
    ///api/core/lendReturn/notifyUrl
    @ApiOperation("借款人还款回调")
    @PostMapping("/notifyUrl")
    public String notifyUrl(HttpServletRequest request){

        return lendReturnService.notifyUrl(request);
    }



    @ApiOperation("查询借款人的还款计划")
    @GetMapping("auth/list")
    public R listBorrowerLendReturns(@RequestHeader("token")String token){

        List<LendReturn> lendReturns = lendReturnService.listBorrowerLendReturns(token);
        //可以基于查询到的还款计划列表计算页面中需要的：借款总金额、待还款本金、待还款利息
        if(CollectionUtils.isEmpty(lendReturns)){
            return R.ok().data("items",lendReturns)
                    .data("total",0)
                    .data("totalPrincipal",0)
                    .data("totalInterest",0);
        }
        BigDecimal totalPrincipal = lendReturns.stream().filter(lendReturn -> lendReturn.getStatus()==0)
                .map(LendReturn::getPrincipal)
                .reduce((a,b)->a.add(b)).get();
        BigDecimal totalInterest = lendReturns.stream().filter(lendReturn -> lendReturn.getStatus()==0)
                .map(LendReturn::getInterest)
                .reduce((a,b)->a.add(b)).get();
        //获取状态为待还款的，获取他们的期数   然后获取第一个
        Integer current = lendReturns.stream().filter(lendReturn -> lendReturn.getStatus() == 0)
                .map(LendReturn::getCurrentPeriod).findFirst().get();
        //查询最小的需要还款的期数
        return R.ok().data("items",lendReturns)
                .data("total",lendReturns.get(0).getBaseAmount())
                .data("totalPrincipal",totalPrincipal)
                .data("totalInterest",totalInterest)
                .data("current",current);
    }
    @ApiOperation("查询标的的还款计划")
    @GetMapping("list/{lendId}")
    public R listByLendId(@PathVariable("lendId")String lendId){
        List<LendReturn> lendReturnList = lendReturnService.listByLendId(lendId);
        return R.ok().data("items",lendReturnList);
    }
}

